package edu.fasta.sisinfo2.net;

import edu.fasta.sisinfo2.juegos.Poker;
import edu.fasta.sisinfo2.poker.PokerController;

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public final class Servidor extends Thread { //si hago heredar de thread
	private static Servidor servidor; 
	PokerController control;

	private ServerSocket server;
	private Socket conexion;    
	private ObjectOutputStream salida;
	private ObjectInputStream entrada;
	private int port;    

	private Servidor( ){   //int port
		servidor = null;        
	}           

	public static Servidor getInstance(){
		if( servidor == null){
			servidor = new Servidor(); //una vez creado el objeto

			servidor.control = PokerController.getInstance();
			servidor.port = 8080;

			return servidor;
		}
		return servidor;
	}    

	public void run(){ //execute o run
		try {
			server = new ServerSocket( port , 10  ); //8080 - puerto , backlog cantidad de conexiones abiertas
			//va a recibir solo 10 conexiones
			try {
				esperarConexion();
				obtenerFlujos();
				procesarConexion();

			} catch (EOFException exEOF) {
				System.out.println("El servidor termino la conexion");
				cerrarConexion();                
			}    
		} catch (IOException excepcionES) {
			System.out.println("error de entrada/ salida :");
			excepcionES.printStackTrace();
		}
		finally{
			cerrarConexion();
		}
	}

	private void esperarConexion() throws IOException {

		System.out.println("Esperando una conexion\n");
		conexion = server.accept();

		System.out.println("Conexion  recibida de: " +
				conexion.getInetAddress().getHostName());
	}

	private void obtenerFlujos() throws IOException {
		salida = new ObjectOutputStream(conexion.getOutputStream());
		salida.flush();

		entrada = new ObjectInputStream(conexion.getInputStream());

		System.out.println("\nSe recibieron los flujos de E/S\n");
	}

	// TODO falta el procesar la conexion.
	private void procesarConexion() throws IOException {
		Comando jugada = null;	        
		int retorno = 0;

//		do {
//		} while ( retorno != FIN);
//		analizar manos
//		repartir pozo
//		restaurar
	}

	public void cerrarConexion() {
		System.out.println("\nFinalizando la conexion\n");
		try {
			salida.close();
			entrada.close();
			conexion.close();
		} catch (IOException excepcionES) {
			excepcionES.printStackTrace();
		}
	}

	public void enviarDatos( Comando mensaje) {
		try {
			salida.writeObject(mensaje);
			salida.flush();
			System.out.println("\n SERVIDOR: " + mensaje.toString() );
		} catch (IOException exES) {
			System.out.println("\nError al escribir objeto" + exES);
		}
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}
}